package com.bsoft.gol.editor.fileUpload;


import com.bsoft.gol.editor.model.ImportResult;

/**
 * 转换excel中的数据到可以进行数据库操作的类
 * @author 王智伟
 * 
 * X--与excel对应的model<br/>
 * D--与DB关联的model
 *
 */
public interface Translator<X,D> {
	
	/**
	 * 转换前做的工作，转换过程中需要的数据源中的数据提前获取
	 */
	void preTranslate(TableData<X> tableData);
	
	/**
	 * 对象转换，从excel数据model转换成数据库操作的model
	 * <p>
	 * 转换过程会执行3步：
	 * <ul>
	 * <li>1.执行方法preTranslate，将进行数据转换过程中，需要通过标识（如机构代码、医生代码等）去获取对应对象所需的其他的信息（如机构名称、机构ID等）时，就需要进行DB查询。</li>
	 * <li>2.执行方法postTranslate，进行两种数据的转换，将TableData<X>转换成TableData<D>对象，即转换成可以进行DB保存操作的对象</li>
	 * <li>3.执行方法afterTranslate，数据转换后进行的操作。如果转换后数据的基本校验（必填项、数据长度）等</li>
	 * </ul>
	 * </p>
	 * @param tableData excel表格数据
	 * @return 转换后的、包含数据库操作的model的数据表
	 */
	TableData<D> translate(TableData<X> tableData);
	
	/**
	 * 转换成返回结果<br/>
	 * 将执行DB保存操作后的结果合并到TableData<X>对象。因为我们查看日志的时候，需要看到的是原始表格数据。比如导入过程存在错误的时候，有如数据库保存操作失败的情况，这些失败的原因只有在执行DB保存操作的时候可以知道，所以需要将这些信息设置到TableData<X>对象中去。<br/>
	 * 同样的原因，需要将DB操作过程中的失败的条目数合并到TableData<X>对象中。
	 * @param tableData excel表格数据转换后，用于DB操作的数据
	 * @param tableDataOri excel表格数据
	 * @return
	 */
	ImportResult reverse(TableData<D> tableData, TableData<X> tableDataOri);
	
	
	/**
	 * 转换工作
	 * @param tableDataOri excel表格数据
	 * @return tableData excel表格数据转换后，用于DB操作的数据
	 */
	TableData<D> postTranslate(TableData<X> tableData);
	
	
	/**
	 * 转换后做的工作
	 * <p>
	 * 1.转换完成后进行数据校验<br/>
	 * 2.当前线程共享的数据置空，这部分数据，在方法translate执行后便不再使用，而且通常比一般的对象要大一些。所以需要要及时置空，这样可以让JVM有能力及时去回收
	 * </p>
	 * @param tableData excel表格数据转换后，用于DB操作的数据
	 */
	void afterTranslate(TableData<D> tableData);
}
